![]() |
![]() |
|
Die Anzahl der Zeichen, die in eine Textbox eingegeben werden dürfen, lässt sich mit der Eigenschaft MaxLength beschränken. Interessiert die Länge des aktuellen Inhalts, wertet man die schreibgeschützte Eigenschaft TextLength aus. Wenn Sie eine Textbox aus der Toolbox in die Arbeitsfläche des Formulars ziehen und versuchen, die Höhe der Textbox manuell einzustellen, werden Sie die Feststellung machen, dass sich diese Größe unter Zuhilfenahme der Markierungspunkte nicht verändern lässt. Standardmäßig passt sich die Höhe einer Textbox immer der eingestellten Schriftgröße an, die normalerweise 8,25 Punkte beträgt. Ändern Sie die Schriftgröße, ändert sich die Höhe der Textbox automatisch. Dieses Verhalten ist insbesondere dann inakzeptabel, wenn zur Laufzeit die Schriftgröße durch den Anwender verändert werden kann. Im schlimmsten Fall überdeckt die Textbox dann ein anderes Steuerelement. Die Ursache für dieses Verhalten ist die Eigenschaft AutoSize. Diese gibt mit dem Standardwert True an, dass die Höhe des Steuerelements automatisch angepasst wird, wenn die dem Steuerelement zugewiesene Schriftgröße geändert wird. Wollen Sie die Höhe der Textbox dennoch manuell festlegen, legen Sie die AutoSize-Eigenschaft auf False fest.
Viele Anwendungen verlangen beim Start die Anmeldung des Benutzers, zu der auch die Eingabe des Passwortes gehört, das auf keinen Fall in einem lesbaren Klartext in der Textbox angezeigt werden darf. Mit der Eigenschaft PasswordChar können Sie die Eingabe mit einem anzugebenden Zeichen maskieren. Um zum Beispiel das häufig verwendete Zeichen »*« als Maskierung zu verwenden, sieht die Zuweisung, die natürlich auch im Eigenschaftsfenster der Textbox erfolgen kann, folgendermaßen aus:
Eine andere Auswirkung hat CharacterCasing vom Typ der gleichnamigen Enumeration, die manchmal auch in Zusammenhang mit Textfeldern eingesetzt wird, in denen Kennwörter eingegeben werden. Mit dieser Eigenschaft kann festgelegt werden, ob die Eingabe der Groß- und Kleinschreibung beibehalten oder in Groß- oder Kleinbuchstaben konvertiert wird. Die Enumeration CharacterCasing bietet drei Werte an:
Manche Textfelder dienen weniger der Eingabe, sondern sollen vielmehr dem Benutzer Dateninformationen anzeigen, die dieser nicht ändern darf. Solche Textfelder sind schreibgeschützt. Sie können ein schreibgeschütztes Textfeld anbieten, indem Sie es mit der Eigenschaft Enabled deaktivieren. Die Einstellung dazu ist False. Das Textfeld ist dann nicht mehr fokussierbar und wird in hellgrauer Hintergrundfarbe angezeigt, die Schriftfarbe ist Dunkelgrau. Ein Nachteil ist allerdings, dass es dem Anwender versagt bleibt, den Inhalt eines deaktivierten Textfeldes zu markieren und in die Zwischenablage zu kopieren. Abhilfe schafft die Eigenschaft ReadOnly. Legen Sie diese auf True fest, ist das Textfeld zwar schreibgeschützt, andererseits bleibt es weiterhin fokussierbar. Weil ein ReadOnly-Textfeld die Einfügemarke annimmt, kann auch die darin enthaltene Information markiert und in die Zwischenablage kopiert werden. Arbeiten mit ausgewähltem TextIn einem Textfeld kann die gesamte oder ein Teil der Zeichenfolge markiert werden, beispielsweise um den markierten Text zu kopieren oder auszuschneiden. Dabei sind drei Eigenschaften eines TextBox-Objekts von Bedeutung: SelectionStart, SelectionLength und SelectedText. Sehen wir uns zunächst die Definition der zuerst angeführten Eigenschaft an:
Der Rückgabewert ist ein Integer, der die Startposition der markierten Auswahl beschreibt. Für die Interpretation der Zahl können Sie sich den folgenden Satz merken:
Nehmen wir an, es wäre die Zeichenfolge »Visual Studio« in einer Textbox eingetragen und darin der Teilstring »sual« markiert. SelectionStart würde uns die Zahl 2 zurückgeben, da der markierte Teilstring nach dem zweiten Zeichen beginnt. Es muss aber nicht unbedingt ein Zeichen markiert sein, denn das Auswerten dieser Eigenschaft liefert grundsätzlich immer die Position der Einfügemarke zurück, wenn die Textbox fokussiert ist. SelectionStart ist keine schreibgeschützte Eigenschaft und kann daher auch zum Positionieren der Einfügemarke benutzt werden, solange die Eigenschaft SelectionLength, welche die Anzahl der markierten Zeichen zurückgibt, den Wert 0 hat. Wollen Sie programmgesteuert einen bestimmten Teil einer Zeichenfolge markieren, müssen Sie sowohl SelectionStart als auch SelectionLength die passenden Werte übergeben. Die Eigenschaft SelectedText liefert schließlich den markierten Teilstring aus dem Steuerelement: Im Beispiel SelectedTextDemo werden alle drei Eigenschaften exemplarisch eingesetzt. Die Abbildung 16.8 zeigt die grafische Benutzeroberfläche des Beispiels. Im obersten Eingabefeld wird nach dem Start eine Zeichenfolge angezeigt. Wird auf die Schaltfläche Text kopieren geklickt, wird der markierte Teilstring der oberen Textbox in die darunter liegende kopiert.
Abbildung 16.8 Eingabemaske des Beispiels »SelectedTextDemo« Der Rahmen Text markieren, dem eine GroupBox zugrunde liegt, dient diesmal nicht dazu, Container von Optionsschaltflächen zu sein. Sie gruppiert vielmehr zwei Textfelder, die in logischem Zusammenhang stehen, und schafft damit eine optische Gliederung der Eingabemaske für den Benutzer. In den beiden Textboxen können die Startposition sowie die Länge bestimmt werden, mit der in der obersten Textbox ein Teilstring markiert wird. Enthalten beide Textboxen in der GroupBox einen gültigen Wert, wird auch die Schaltfläche Text markieren aktiviert. Wenn Sie diese Schaltfläche anklicken, wird der leere Ausgangszustand in den beiden Eingabefeldern des Rahmens wiederhergestellt und die Schaltfläche deaktiviert. Sehen wir uns nun den Programmcode an, der von uns zur Erfüllung der Funktionalität codiert werden muss.
Im Ereignishandler btnCopy_Click lassen wir aus informativen Gründen zuerst in einer Messagebox die Startposition und die Länge des in der obersten Textbox markierten Teilstrings ausgeben. Erst danach leistet der Handler seine eigentliche Aufgabe und kopiert den markierten Teil der Zeichenfolge mit
Die Eigenschaft Enabled der Schaltfläche Text markieren ist im Eigenschaftsfenster auf False gesetzt. Wenn die Anwendung gestartet wird, ist diese Schaltfläche also deaktiviert. Es ist nur dann sinnvoll, sie zu aktivieren, wenn in den beiden Textboxen der GroupBox ein gültiger Wert enthalten ist. Daher muss ein Weg gefunden werden, der es uns ermöglicht, das zu überprüfen. Es bietet sich dazu das Ereignis TextChanged des TextBox-Objekts an, das immer dann ausgelöst wird, wenn sich der Inhalt der Eigenschaft Text ändert. Da die Überprüfung in den TextChanged-Ereignissen der beiden Eingabefelder identisch ist, reicht ein Ereignishandler zur Behandlung beider Ereignisse aus. Die entsprechende Einstellung kann im Eigenschaftsfenster vorgenommen werden, wenn man sich in der rechten Spalte die Liste alle passenden Ereignisse anzeigen lässt. Der Ereignishandler im Beispiel ist mit SelectText bezeichnet. Jedes Mal, wenn sich der Inhalt einer der beiden Textboxen im Rahmen ändert, muss geprüft werden, ob in diesem Augenblick beide einen Inhalt aufweisen:
Nur dann, wenn beide Textboxen nicht leer sind, wird die Schaltfläche Text markieren aktiviert. Zum Schluss dürfen wir die alles entscheidende Anweisung nicht vergessen: Solange die Textbox nicht den Fokus hat, werden wir auch keinen markierten Text sehen. Wir müssen diesen demnach unserer Textbox ausdrücklich übergeben. Dazu dient die Methode Focus. Prüfen, ob sich der Inhalt einer Textbox geändert hatAls ausgesprochen nützlich kann sich die Eigenschaft Modified erweisen, die als boolescher Wert die Information darüber liefert, ob sich der Inhalt einer Textbox geändert hat. Wird eine Textbox neu erstellt, wird diese Eigenschaft mit False initialisiert. Ändert der Anwender durch eine Eingabe den Inhalt der Textbox, setzt die Textbox Modified auf True. Man kann diese Information beispielsweise dazu benutzen, um die Frage zu klären, ob der Inhalt eines Textfeldes in einer Datei gespeichert werden muss oder nicht. Allerdings darf man auch nicht vergessen, die Eigenschaft nach der Verarbeitung der Änderung manuell wieder auf False zurückzusetzen, denn das passiert nicht automatisch. Automatische VervollständigungWas mit dem .NET Framework 1.0/1.1 noch das mühevolle Schreiben von Code verursachte, ist nun als neues Feature der TextBox und auch der ComboBox, der wir uns später noch widmen, sofort »eingebaut«: die Autovervollständigung. Dieses altbekannte, aber für die beiden Steuerelemente neue Verhalten unterstützt den Benutzer bei seinen Eingaben, indem es aus einer Liste den nächsten passenden Eintrag sucht und die Benutzereingabe nach rechts um einen Vorschlag erweitert. Nur drei Eigenschaften bewirken die Autovervollständigung:
Die Autovervollständigung setzt zunächst voraus, dass AutoCompleteMode auf einen Wert, der nicht None ist, eingestellt wird. Dazu stehen Ihnen die Konstanten der Enumeration AutoCompleteMode zur Verfügung, die Sie der folgenden Tabelle entnehmen können.
Abbildung 16.9 zeigt die Unterschiede zwischen den drei Konstanten zur Laufzeit.
Abbildung 16.9 Darstellung der Autovervollständigung, abhängig von der Einstellung »AutoCompleteMode« Es stellt sich natürlich die Frage, aus welcher Liste die Informationen bezogen werden, aus denen der Anwender gegebenenfalls seine Wahl treffen kann. Hier entscheidet die Einstellung der Eigenschaft AutoCompleteSource, die auf einer gleichnamigen Enumeration ihrer Werte basiert. Je nachdem, was im Eingabefeld eingetragen werden soll, können Sie auf verschiedene interne Systemlisten zurückgreifen, beispielsweise auf HistoryList, Filesystem oder AllUrl. Eine weitere Alternative ist die Einstellung CustomSource, um eine eigene Liste zur Verfügung zu stellen. Diese kann bereits zur Entwicklungszeit gefüllt werden, aber auch dynamisch zur Laufzeit. Die selbst definierte Liste wird durch die dritte Eigenschaft im Bunde, AutoCompleteCustomSource, beschrieben. Im Eigenschaftsfenster brauchen Sie nur auf die Schaltfläche in der Wertespalte zu klicken, um in dem sich daraufhin öffnenden Dialog die Listenelemente einzutragen (siehe Abbildung 16.10).
Abbildung 16.10 Benutzerdefinierte Liste für die Autovervollständigung AutoCompleteCustomSource liefert die Referenz auf eine Collection vom Typ AutoCompleteStringCollection. Wollen Sie die Liste zur Laufzeit füllen oder bestehende Einträge ergänzen, stehen Ihnen die üblichen Methoden Add und AddRange nebst allen anderen zur vollständigen Verwaltung der gesamten Auflistung zur Verfügung (Remove, Insert usw.). Zusammenfassung der Eigenschaften des einzeiligen TextfeldesFassen wir an dieser Stelle in übersichtlicher Form die Eigenschaften zusammen, die kennzeichnend für eine Textbox sind.
Methoden eines einzeiligen TextfeldesEine Reihe von nützlichen Methoden erleichtert und unterstützt die Programmierung von Textboxen. Dazu gehört die Methode Select, mit der wir Text im Steuerelement markieren können.
Der erste Parameter legt die Position des ersten Zeichens in der aktuellen Textmarkierung des Textfeldes fest, der zweite die Anzahl der zu markierenden Zeichen. Diese Methode erspart uns also die Zuweisung an die beiden Eigenschaften SelectionStart und SelectionLength. Die Methode SelectAll markiert den gesamten Text im Textfeld:
Möchten Sie, dass der gesamte Inhalt einer Textbox beim Erhalt des Fokus markiert wird, sollten Sie die Methode SelectAll im Enter-Ereignis der Textbox aufrufen:
Mit der Methode Clear weisen Sie der Text-Eigenschaft eine leere Zeichenfolge zu. Um den Inhalt einer Textbox zu ergänzen, werden Sie vermutlich meistens eine Anweisung ähnlich der folgenden programmieren:
Die Methode AppendText bietet dazu eine Alternative an:
Das TextBox-Steuerelement ist mit der Fähigkeit ausgestattet, in gewohnter Weise die Zwischenablage zu nutzen. Sie müssen dazu nur den Mauszeiger auf markierten Text positionieren und mit der rechten Maustaste das Kontextmenü öffnen. Zum Ausschneiden, Kopieren, Einfügen und Löschen stehen dem Anwender die üblichen Funktionalitäten zur Verfügung, ohne dass Sie dazu auch nur eine Zeile Code schreiben müssen. Alternativ kann der Anwender auch mit den Tastenkombinationen (Strg) + (X) den markierten Text löschen, mit (Strg) + (C) den markierten Text in die Zwischenablage kopieren oder mit (Strg) + (V) den Inhalt der Zwischenablage an der Position der Einfügemarke einfügen. Mit den Methoden Cut, Copy und Paste können Sie auch direkt im Programmcode mit der Zwischenablage zusammenarbeiten. Mit Cut wird der markierte Text ausgeschnitten und in die Zwischenablage geschoben. Randbedingung ist dabei, dass im Eingabefeld Text markiert ist. Sehr ähnlich arbeitet die Methode Copy, jedoch ohne dabei gleichzeitig den markierten Text auszuschneiden. Soll der Inhalt der Zwischenablage an der Stelle in einer Textbox eingefügt werden, an der sich aktuell die Einfügemarke befindet, müssen Sie die Methode Paste auf dieses Eingabefeld aufrufen. Um die jeweils letzte Operation rückgängig zu machen, rufen Sie Undo auf. Alle vier zuletzt aufgeführten Methoden sind parameterlos und haben auch keinen Rückgabewert. Zusammenfassung der wichtigsten Methoden eines einzeiligen EingabefeldsAbschließend sind alle angesprochenen Methoden der Übersicht wegen in der folgenden Tabelle zusammengefasst.
16.6.2 Mehrzeilige Eingabefelder
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Public Property ScrollBars As ScrollBars |
In der Enumeration ScrollBars sind die Werte festgelegt, die der gleichnamigen Eigenschaft zugewiesen werden können.
| Member | Beschreibung |
| None | Es werden keine Bildlaufleisten angezeigt. |
| Horizontal | Es wird nur eine horizontale Bildlaufleiste angezeigt. |
| Vertical | Es wird nur eine vertikale Bildlaufleiste angezeigt. |
| Both | Es werden sowohl eine horizontale als auch eine vertikale Bildlaufleiste angezeigt. |
Wenn Sie der Eigenschaft ScrollBars eines mehrzeiligen Eingabefelds die Einstellung Both oder Horizontal zuweisen, werden Sie feststellen, dass keine horizontale Bildlaufleiste angezeigt wird. Verantwortlich dafür ist die Eigenschaft WordWrap, die zunächst immer True gesetzt ist. Diese Vorgabe bewirkt, dass der eingegebene Text automatisch umbrochen wird, wenn die Textbreite die Breite der Textbox überschreitet.
| Public Property WordWrap As Boolean |
Hat WordWrap den Wert False, wird auch eine deaktivierte horizontale Bildlaufleiste angezeigt, die erst aktiviert wird, wenn zur Laufzeit die Notwendigkeit dazu besteht.
Die Einstellung WordWrap=False bewirkt, dass der Anwender so lange Text in eine Zeile schreiben kann, bis er mit der (Enter)-Taste einen Zeilenumbruch erzwingt. Durch Scrollen der horizontalen Bildlaufleiste kann dann auch der Teil der Zeichenfolge gelesen werden, der den sichtbaren Bereich des Textfeldes verlassen hat.
Als ausgesprochen nützlich kann es sich erweisen, jede einzelne Zeile eines mehrzeiligen Textfeldes abzufragen. Dazu müssen Sie nicht den gesamten Inhalt einer Textbox nach den Zeilen-umbrüchen durchsuchen, denn die Eigenschaft Lines nimmt Ihnen diese Arbeit ab:
| Public Property Lines As String() |
Lines ist vom Typ String-Array. Der Text bis zum ersten Zeilenumbruch wird daher den Index 0 haben, bis zum zweiten Zeilenumbruch den Index 1 usw. Beispielsweise liefert die Anweisung
| Dim str As String = textBox1.Lines(2) |
den Inhalt der dritten Zeile – vorausgesetzt, in der Textbox ist eine solche enthalten. Ansonsten wird eine Ausnahme ausgelöst, die sich dadurch vermeiden lässt, wenn zuvor vorher mit der Eigenschaft Length die Gesamtanzahl der Elemente im Array ermittelt wird, z. B.:
| If textBox1.Lines.Length > 2 Then |
| str = textBox1.Lines(2) |
Sie können über die Eigenschaft Lines einem Eingabefeld auch einen Inhalt zuweisen. Übergeben Sie dazu ein Array mit dem gewünschten Text. Jedes Array-Element wird dann in einer eigenen Zeile angezeigt:
| Dim stadt As String = "München" |
| Dim str() As String = {"Berlin","Hamburg", stadt} |
| textBox1.Lines = str |
Manchmal werden mehrzeilige Textfelder dazu benutzt, den Clientbereich einer Form vollständig auszufüllen. Der MS-Editor ist ein Beispiel dafür. Kennzeichnend für Dokumentenfenster ist, dass sich bei einer Vergrößerung der Form die Größe des Textfensters automatisch anpasst.
Unter .NET ist die Lösung dieses Problems geradezu genial einfach. Legen Sie dazu nur die Eigenschaft Dock wie folgt fest:
| textBox1.Dock = DockStyle.Fill |
Das ist bereits alles! Die Textbox nimmt danach den gesamten Clientbereich für sich in Anspruch und wird sich dem auch anpassen, sollte der Anwender zur Laufzeit die Größe der Form ändern.
In Forms haben (Tab)- und (Enter)-Taste eine besondere Bedeutung: Mit der (Tab)-Taste bewegt man den Fokus von einem fokussierbaren Steuerelement zum nächsten, mit der Eingabetaste wird üblicherweise die OK-Schaltfläche aktiviert und der Ereignishandler, der mit dem Click-Ereignis verknüpft ist, ausgeführt. Während der Fokuswechsel mit der (Tab)-Taste das Standardverhalten einer Form ist, wird mit der Eigenschaft AcceptButton der Form eine Schaltfläche (meist die OK-Schaltfläche) zur Standardfläche der Eingabetaste erklärt.
Bei mehrzeiligen Textfeldern ist häufig ein anderes Verhalten dieser beiden Tasten wünschenswert. Der Anwender erwartet, dass mit der Eingabetaste ein Zeilenumbruch und mit der Tabulatortaste ein Tabstopp-Zeichen in das Steuerelement eingefügt wird. Damit die beiden Tasten diesen Erwartungen entsprechen, müssen zwei Eigenschaften des TextBox-Objekts auf True gesetzt werden: AcceptsReturn und AcceptsTab. Um mit der Einstellung AcceptsTab=True den Fokus zum nächsten Steuerelement zu verschieben, muss der Anwender nun allerdings die Tastenkombination (Strg) + (Tab) betätigen.
Enthält das Formular keine Schaltfläche, die mit der Eigenschaft AcceptButton der Form zur Standardschaltfläche des Formulars erklärt wird, wirkt sich das Drücken der Eingabetaste unabhängig von der Einstellung der Eigenschaft AcceptsReturn immer als Zeilenumbruch aus.
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken.
Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die
gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich
geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung,
Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.